<?php

/**
 * alltosun.com 余额记录方法 user_money_record.php
 * ============================================================================
 * 版权所有 (C) 2009-2014 北京互动阳光科技有限公司，并保留所有权利。
 * 网站地址: http://www.alltosun.com
 * ----------------------------------------------------------------------------
 * 许可声明: 这是一个开源程序，未经许可不得将本软件的整体或任何部分用于商业用途及再发布。
 * ============================================================================
 * $Author: 高昂 (gaoa@alltosun.com) $
 * $Date: 2014-8-8 下午12:36:18 $
 * $Id: user_money_record_helper.php 156300 2015-12-17 04:13:18Z gaoa $
 */
class user_money_helper
{
    /**
     * 判断用户是否打开余额
     */
    public static function is_user_money_enable($user_id) {
        if (!$user_id) {
            return 0;
        }

        $user_info = user_helper::get_user_info($user_id);
        if (!$user_info) {
            return 0;
        }

        $role_id = user_helper::get_user_role_id($user_id);
        if ($role_id == user_config::AGENCY) {
            return $user_info['is_user_money_enable'];
        } elseif ($role_id == user_config::STORE_MANAGER || $role_id == user_config::STORE_OWNER) {
            $store_info = store_helper::get_user_store($user_id);
            if (!$store_info) {
                $store_info = store_helper::get_store_info_by_user_id($user_id);
            }
            $dealer_info = user_helper::get_user_info($store_info['agency_id']);
            return $dealer_info['is_user_money_enable'];
        } else {
            return 0;
        }
    }

    /**
     * 格式化余额列表
     * @param unknown_type $data
     */
    public static function user_money_record_format($data) {
        $user_money_record_list = array();
        if ($data) {
            foreach ($data as $k => $record) {

                $user_money_record_list[$k]['user_id'] = $record['user_id'];
                $user_money_record_list[$k]['add_time'] = $record['add_time'];
                $user_money_record_list[$k]['user_money'] = $record['user_money'];

                // 减余额
                $user_money_record_list[$k]['minus'] = $record['user_money'] < 0 ? 1 : 0;

                // 余额类型
                $type_info = _uri('user_money_type', $record['res_id']);
                if ($type_info && $type_info['status'] == 1) {
                    $user_money_record_list[$k]['res_name'] = $type_info['res_name'];
                } else {
                    $user_money_record_list[$k]['res_name'] = '其他途径';
                }

                $user_money_record_list[$k]['content'] = '';

                // 获取余额类型 1:后台添加,2;进货 3,发货 4,违规 5,用户初始添加余额 6,核销
                switch ($record['res_id']) {

                    // 1:后台添加
                    case 1:
                        $user_money_record_list[$k]['content'] = $type_info['res_name'];
                        break;

                    // 2;进货 3,发货
                    case 2:
                        $order_info = order_helper::get_order_detail($record['order_id']);
                        if ($order_info) {
                            $user_money_record_list[$k]['content'] = '订单编号: ' . $order_info['order_no'];
                        }
                        break;
                    case 3:
                        $order_info = order_helper::get_order_detail($record['order_id']);
                        if ($order_info) {
                            $user_money_record_list[$k]['content'] = '完成' . $order_info['goods_num'] . '箱发货';
                        }
                        break;
                    case 5:
                        // 用户初始添加余额
                        $user_money_record_info = _model('user_money_record')->read(array(
                            'user_id' => $record['user_id'],
                            'res_id' => 5
                        ));
                        $user_money_record_list[$k]['res_name'] = '用户初始添加' .
                                                                  $user_money_record_info['user_money'] .
                                                                  '余额';
                        break;
                    case 4:
                        //违规(没有余额子类型,只是违规)
                        break;
                    case 6:
                        // 核销
                        $vocher_record_info = _model('store_verify_vocher_record')->read(array(
                            'user_id' => $record['user_id'],
                            'add_time' => $record['add_time']
                        ));
                        if ($vocher_record_info) {
                            $user_money_record_list[$k]['content'] = '优惠码: ' . $vocher_record_info['discount_code'];
                        }
                        break;
                    default:
                        //此处判断违规(有子类型)
                        //通过res_id获取父级id
                        $user_money_type_info = _model('user_money_type')->read(array(
                            'parent_id' => 4,
                            'id' => $record['res_id']
                        ));
                        if ($user_money_type_info) {
                            $user_money_record_list[$k]['content'] = $user_money_type_info['res_name'];
                        }
                        break;
                }
            }
            return $user_money_record_list;
        }
        return false;
    }

    /**
     * TODO 作废
     *
     * 通过订单id获取余额的数量
     */
    //    public static function get_user_money_by_order_id($order_id) {
    //        if (!$order_id) {
    //            return 0;
    //        }
    //
    //        // 获取此订单的散装订单商品列表信息
    //        // 统计所有是散装的商品id
    //        $goods_ids = _model('goods')->getFields('id', array('category_id' => 1));
    //        $order_relation_list = order_helper::get_order_relation_by_order_id($order_id, '', array(
    //            'order_id' => $order_id,
    //            'goods_id' => $goods_ids
    //        ));
    //        if (!$order_relation_list) {
    //            return 0;
    //        }
    //
    //        // 散装商品箱数
    //        $goods_num = 0;
    //        foreach ($order_relation_list as $k => $v) {
    //            $goods_num += $v['goods_num'];
    //        }
    //
    //        $user_money_rate = user_money_helper::get_goods_baobaob_num();
    //        return $user_money_rate * $goods_num;
    //    }

    /**
     * 通过订单id增加用户余额,返回增加的余额数
     * @param unknown $order_id
     */
    public static function add_user_money($order_id) {
        if (!$order_id) {
            return 0;
        }

        $order_info = order_helper::get_order_info($order_id);
        if (!$order_info) {
            return 0;
        }

        $user_money_num = $order_info['user_money'];
        if (!$user_money_num) {
            return 0;
        }

        $type = $order_info['type'];
        $progress = $order_info['progress'];
        $user_id = $order_info['user_id'];
        $user_info = user_helper::get_user_info($user_id);
        $role_id = user_helper::get_user_role_id($user_id);

        // 如果是合伙人则增加其余额的总限额数 ,如果是商家则根据订单状态(暂定只在确认到货之后)增加其余额
        /**
         * 先判断是否允许使用余额 如果允许
         *      判断如果是合伙人则增加余额限额
         *      如果是商家则增加余额余额, 并增加合伙人已发余额
         * 如果不允许使用余额,返回0
         */
        if ($order_info['is_user_money_enable']) {
            if ($role_id == user_config::AGENCY) {
                $order_total_user_money = $user_info['order_total_user_money'] + $user_money_num;
                user_helper::update_user_info($user_id, array('order_total_user_money' => $order_total_user_money));
                // @TODO 增加余额总额是否需要记录到增加余额的记录中
                return $user_money_num;
            } elseif ($role_id == user_config::STORE_MANAGER || $role_id == user_config::STORE_OWNER) {
                // 如果是第一家分店,则余额加给总店
                $store_info = store_helper::get_store($order_info['store_id']);
                if ($store_info['store_order'] == 1) {
                    $user_id = $store_info['owner_id'];
                    $user_info = user_helper::get_user_info($user_id);
                }
                $user_money = $user_info['user_money'] + $user_money_num;
                user_helper::update_user_info($user_id, array('user_money' => $user_money));
                user_money_helper::add_user_money_record($user_id, $user_money);
                // 增加所属合伙人的已发余额总量
                $dealer_info = user_helper::get_user_info($order_info['agency_id']);
                $sell_store_user_money = $dealer_info['sell_store_user_money'] + $user_money;
                user_helper::update_user_info($order_info['agency_id'], array('sell_store_user_money' => $sell_store_user_money));
                return $user_money_num;
            } else {
                return 0;
            }
        } else {

            return 0;
        }

    }

    /**
     * 打开余额使用限制(是否是打开合伙人的余额则合伙人旗下的门店都打开,还是自己是自己的限制?@TODO)
     */
    public static function open_user_money_limit($dealer_id) {
        // 暂定为打开合伙人的限制则打开旗下所有商家的限制
        //         $store_list = store_helper::get_store_list_by_dealer_id($dealer_id);
        //         $user_store_list = store_helper::get_user_store_list_by_id($dealer_id, 0);
        $time = date('Y-m-d H:i:s');
        //         if ($store_list) {
        //             foreach ($store_list as $k=>$v) {
        //                 user_helper::update_user_info($v['user_id'], array('is_user_money_enable'=>1, 'open_user_money_time'=>$time));
        //             }
        //         }
        //         if ($user_store_list) {
        //             foreach ($user_store_list as $k=>$v) {
        //                 user_helper::update_user_info($v['user_id'], array('is_user_money_enable'=>1, 'open_user_money_time'=>$time));
        //             }
        //         }

        user_helper::update_user_info($dealer_id, array('is_user_money_enable' => 1, 'open_user_money_time' => $time));
    }

    /**
     * 增加余额记录
     */
    public static function add_user_money_record($param = array()) {

        $rule = array(
            'user_id' => null,
            'role_id' => 0,
            'admin_id' => 0,
            'user_money' => 0,
            'add_time' => datetime(),
            'res_id' => 2,
            'order_id' => 0,
            'extra' => '',
        );

        $record = parse_param($rule, $param);

        if (!$record['user_id']) {
            return false;
        }

        if ($record['admin_id'] > 0) {
            $record['role_id'] = user_helper::get_user_role_id($record['admin_id']);
        }

        $res = _model('user_money_record')->create($record);

        return $res ? true : false;
    }

    /**
     * 变更用户余额
     *
     * @param {array}
     *  => {integer} user_id 当前登陆用户id
     *  => {integer} store_id 店铺的id
     *  => {integer} order_id 订单id
     *  => {integer} bbcoin 抱抱币数,如果需要减抱抱币,直接传负数即可
     *  => {integer} res_id 抱抱币类型id 参考 bbcoin_type
     *  => {integer} admin_id 管理员id
     *  => {integer} role_id 角色id
     *  => {string} extra 备注
     * @return {boolean}
     * @throws AnException
     */
    public static function change_user_money($param = array()) {

        $rule = array(
            'user_id' => null,
            'admin_id' => 0,
            'user_money' => 0,
            'res_id' => user_money_config::RES_TYPE_PURCHASE, // 默认为进货
            'order_id' => 0,
            'extra' => '',
        );

        $data = parse_param($rule, $param);

        if (!$data['user_id'] || !is_numeric($data['user_money'])) {
            return false;
        }

        $user_info = user_helper::get_user_info($data['user_id']);
        if (!$user_info) {
            return false;
        }

        $new_user_money = $data['user_money'] + $user_info['user_money'];

        // 减扣到0不能为负
        if ($new_user_money < 0) {
            $new_user_money = 0;
            $actual_change = $new_user_money - $user_info['user_money'];
            // 溢出部分添加到备注
            $data['extra'] .= ($data['extra'] ? ', ' : '') .
                              '操作值:' .
                              num_keep_two_round($data['user_money']) .
                              ' 实际变化:' .
                              num_keep_two_round($actual_change) .
                              ' 无效溢出:' .
                              num_keep_two_round($data['user_money'] - $actual_change);
            // 实际的变化值
            $data['user_money'] = $actual_change;
        }

        // if ($data['user_money'] != 0) {
        $res = user_helper::update_user_info($data['user_id'], array(
            'user_money' => $new_user_money,
            'update_time' => datetime()
        ));
        if (!$res) {
            return false;
        }
        // }

        // 仅仅是记录一下
        self::add_user_money_record($data);

        return true;
    }

    public static function get_user_money_by_user_id($user_id) {
        return _uri('user', $user_id, 'user_money');
    }
}

?>